#ifdef GL_ES
precision mediump float;
#endif

uniform vec2 u_resolution;
uniform float u_time;

/**
 * 主函数，负责计算并输出片段颜色
 * 
 * 该函数通过以下步骤生成最终颜色：
 * 1. 将屏幕坐标转换为标准化坐标
 * 2. 计算基于时间变化的径向距离（实现圆形由外向内收缩的循环效果）
 * 3. 根据距离生成RGB颜色值
 * 4. 输出最终片段颜色
 * 
 * 使用的uniform变量：
 * - u_resolution: 屏幕分辨率
 * - u_time: 当前时间（秒）
 * 
 * 返回值：无返回值，直接设置gl_FragColor
 */
void main() {
    // 将屏幕坐标转换为以屏幕中心为原点的标准化坐标系
    vec2 uv = (gl_FragCoord.xy * 2. - u_resolution.xy) / min(u_resolution.x, u_resolution.y);
    
    // 使用sin函数创建平滑的来回动画效果
    // sin函数的值域为[-1,1]，加上1后变为[0,2]，再除以2得到[0,1]的范围
    // 通过 (1.0 - sin(...)) 翻转动画，实现由外向内的效果
    // 修改 u_time 的系数可以控制扩散速率：
    // - 增大系数会使扩散变快
    // - 减小系数会使扩散变慢
    float speed = 2.0;  // 扩散速率控制参数
    float animation = 1.0 - (sin(u_time * speed) * 0.5 + 0.5);
    
    // 计算到中心点的距离，并加入动画因子
    // 使用 1.0 - animation 来控制由外向内的动画
    float r = length(uv) / max(animation, 0.001);  // 防止除零错误
    
    // 根据距离计算RGB颜色分量，距离越远颜色越暗
    vec3 color = vec3(max(0.0, 1.0 - r), max(0.0, 1.0 - 2.0 * r), max(0.0, 1.0 - 3.0 * r));
    
    // 设置片段的最终颜色，alpha值固定为1.0
    gl_FragColor = vec4(color, 1.0);
}